"""
网络管理模块
~~~~~~~~~~

负责DHT网络通信的管理，包括：
1. UDP服务器的启动和停止
2. 网络消息的收发
3. 节点状态维护
"""

import asyncio
from typing import Optional, Tuple
from src.log.logger import setup_logger
import logging
from src.rpc.transation_holder import TransactionHolder
from src.utils.utils import gen_node_id

class NetworkManage:
    """网络管理类，处理DHT网络通信。"""

    @staticmethod
    def create_instance(host: str, port: int):
        if not host or not port:
            raise ValueError("host 和 port 不能为空")
        network_manage = NetworkManage(host, port)
        return network_manage

    def __init__(self, host: str, port: int):
        """
        初始化网络管理器。

        Args:
            host: 监听地址
            port: 监听端口
        """
        self.host: str = host
        self.port: int = port
        self.node_id: bytes = gen_node_id()
        self.logger: logging.Logger = setup_logger('NetworkManage')
        self.transport: Optional[asyncio.DatagramTransport] = None
        self.protocol: Optional[asyncio.DatagramProtocol] = None
        self.transaction_holder: Optional[TransactionHolder] = TransactionHolder()

   

    async def start_server(self, protocol: asyncio.DatagramProtocol) -> None:
        """
        启动UDP服务器。

        Args:
            protocol: 协议处理对象
        """
        try:
            loop = asyncio.get_running_loop()
            self.transport, self.protocol = await loop.create_datagram_endpoint(
                lambda: protocol,
                local_addr=(self.host, self.port)
            )
            self.logger.info(f"UDP服务器启动成功 - {self.host}:{self.port}")
        except Exception as e:
            self.logger.error(f"启动UDP服务器失败: {e}")
            raise

    async def stop_server(self) -> None:
        """停止UDP服务器。"""
        if self.transport:
            self.transport.close()
            self.transport = None
            self.logger.info("UDP服务器已停止")

    def send_message(self, data: bytes, addr: Tuple[str, int]) -> None:
        """
        发送UDP消息。

        Args:
            data: 要发送的数据
            addr: 目标地址和端口
        """
        if self.transport:
            try:
                self.transport.sendto(data, addr)
            except Exception as e:
                self.logger.error(f"发送消息失败: {e}")
        else:
            self.logger.warning("UDP服务器未启动")

    

